package com.mframe.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;

@SuppressWarnings("unchecked")
public class CollectionUtil {
	
	
	/**
	 *	返回一个Map，该Map 过略掉 map里面值是null 或 ""空字符串值 
	 * @param map
	 * @return
	 */
	public static <K,V>  Map<K,V> clearBlankValue(Map<K,V> map){
		Map<K,V> resultMap = new HashMap<K,V>();
		if(map!=null&&!map.isEmpty()){
			for(Entry<K,V> entry : map.entrySet()){
				if(entry.getValue()==null||"".equals(entry.getValue().toString().trim())){
					continue;
				}
				resultMap.put(entry.getKey(), entry.getValue());
			}
		}
		return resultMap;
	}
	
	/**
	 *
	 * 过滤掉 map里制定的key
	 * @param map 被过滤的map
	 * @param removelist 要移除的key 
	 * @param dataTypeMap key的value类型转换
	 * @return
	 */
	
	public static <K,V> Map<K,V> clearSpecifyValue(Map<K,V> map, ArrayList removelist, Map<String, String> dataTypeMap){
		Map resultMap = new HashMap<String,Object>();
		if(map!=null&&!map.isEmpty()){
			for(Entry<K,V> entry : map.entrySet()){
				if(entry.getValue()==null||"".equals(entry.getValue().toString().trim())){
					continue;
				}
				if ((removelist != null) && (removelist.size() > 0)) {
					if (removelist.indexOf(entry.getKey()) >= 0)
						continue;
				}
				
				if (dataTypeMap != null) {
					String strDataType = dataTypeMap.get(entry.getKey());
					if ((strDataType != null) && (strDataType.equals("Long")))
						resultMap.put(entry.getKey().toString(), Long.valueOf(entry.getValue().toString()));
					else
						resultMap.put(entry.getKey().toString(), entry.getValue());
				}
				else {
					resultMap.put(entry.getKey().toString(), entry.getValue());					
				}


			}
		}
		return resultMap;
	}
	/**
	 * 返回a-b的集合.
	 */
	public static <T> List<T> subtract(final Collection<T> a, final Collection<T> b) {
		ArrayList<T> list = new ArrayList<T>(a);
		for (Object element : b) {
			list.remove(element);
		}
		return list;
	}

	/**
	 * 提取集合中的对象的属性(通过Getter函数), 组合成Map.
	 * 
	 * @param collection 来源集合.
	 * @param keyPropertyName 要提取为Map中的Key值的属性名.
	 * @param valuePropertyName 要提取为Map中的Value值的属性名.
	 */
	public static Map extractToMap(final Collection collection, final String keyPropertyName,
			final String valuePropertyName) {
		Map map = new HashMap(collection.size());

		try {
			for (Object obj : collection) {
				map.put(PropertyUtils.getProperty(obj, keyPropertyName),
						PropertyUtils.getProperty(obj, valuePropertyName));
			}
		} catch (Exception e) {
			throw Reflections.convertReflectionExceptionToUnchecked(e);
		}

		return map;
	}

	/**
	 * 提取集合中的对象的属性(通过Getter函数), 组合成List.
	 * 
	 * @param collection 来源集合.
	 * @param propertyName 要提取的属性名.
	 */
	public static List extractToList(final Collection collection, final String propertyName) {
		List list = new ArrayList(collection.size());

		try {
			for (Object obj : collection) {
				list.add(PropertyUtils.getProperty(obj, propertyName));
			}
		} catch (Exception e) {
			throw Reflections.convertReflectionExceptionToUnchecked(e);
		}

		return list;
	}

	/**
	 * 提取集合中的对象的属性(通过Getter函数), 组合成由分割符分隔的字符串.
	 * 
	 * @param collection 来源集合.
	 * @param propertyName 要提取的属性名.
	 * @param separator 分隔符.
	 */
	public static String extractToString(final Collection collection, final String propertyName, final String separator) {
		List list = extractToList(collection, propertyName);
		return StringUtils.join(list, separator);
	}

	/**
	 * 转换Collection为String, 中间以 separator分隔。
	 */
	public static String convertToString(final Collection collection, final String separator) {
		return StringUtils.join(collection, separator);
	}

	/**
	 * 转换Collection为String, 每个元素的前面加入prefix，后面加入postfix，如<div>mymessage</div>。
	 */
	public static String convertToString(final Collection collection, final String prefix, final String postfix) {
		StringBuilder builder = new StringBuilder();
		for (Object o : collection) {
			builder.append(prefix).append(o).append(postfix);
		}
		return builder.toString();
	}
	
	public static  List converStringtoList(final String str,final String separator, Class transType){
		if(str!=null&&StringHelper.isNotBlank(str)
				&&separator!=null&&StringHelper.isNotBlank(separator)){
			String[] sstr = str.split(separator);
			List result = new ArrayList();
			for(String s :sstr){
				if(Long.class.equals(transType)){
					result.add(Long.valueOf(s.trim()));
				}
				
			}
			return result;
		}
		return new ArrayList(0);
	}

}